﻿// Dùng tại:
//      + frmDMHopDong
//      + clsChuyenDL
//      + rptInHDThang

using System;
using System.Data;
using System.Data.SqlClient;

namespace prjKQXS_DLL.Hop_dong
{
    public class clsHopDong
    {
        //Cài đặt event OnError để bắt các lỗi chưa được xử lý
        public delegate void OnErrorHandler(Exception e);
        public event OnErrorHandler OnError;

        //Cài đặt event OnAction để thông báo các trạng thái kết quả
        public delegate void OnActionHandler(SqlException e);
        public event OnActionHandler OnAction;

        #region Fields and Properties ==============================================================
        private int m_ID = 0;
        public int ID
        {
            get { return m_ID; }
            set { m_ID = value; }
        }

        private string m_Ma_DT = string.Empty;
        public string Ma_DT
        {
            get { return m_Ma_DT; }
            set { m_Ma_DT = value; }
        }

        private DateTime m_Ngay_HD = DateTime.Now;
        public DateTime Ngay_HD
        {
            get { return m_Ngay_HD; }
            set { m_Ngay_HD = value; }
        }

        private string m_Ma_DMCanBo = string.Empty;
        public string Ma_DMCanBo
        {
            get { return m_Ma_DMCanBo; }
            set { m_Ma_DMCanBo = value; }
        }

        private string m_Ten_CanBo = string.Empty;
        public string Ten_CanBo
        {
            get { return m_Ten_CanBo; }
            set { m_Ten_CanBo = value; }
        }

        private string m_Noi_O = string.Empty;
        public string Noi_O
        {
            get { return m_Noi_O; }
            set { m_Noi_O = value; }
        }

        private string m_MST = string.Empty;
        public string MST
        {
            get { return m_MST; }
            set { m_MST = value; }
        }

        private string m_CMT = string.Empty;
        public string CMT
        {
            get { return m_CMT; }
            set { m_CMT = value; }
        }

        private string m_Noi_Cap = string.Empty;
        public string Noi_Cap
        {
            get { return m_Noi_Cap; }
            set { m_Noi_Cap = value; }
        }

        private DateTime m_Ngay_Cap = DateTime.Now;
        public DateTime Ngay_Cap
        {
            get { return m_Ngay_Cap; }
            set { m_Ngay_Cap = value; }
        }

        private string m_Noi_Ban = string.Empty;
        public string Noi_Ban
        {
            get { return m_Noi_Ban; }
            set { m_Noi_Ban = value; }
        }

        private DateTime m_Ngay_Ban = DateTime.Now;
        public DateTime Ngay_Ban
        {
            get { return m_Ngay_Ban; }
            set { m_Ngay_Ban = value; }
        }

        private decimal m_So_Tien = 0;
        public decimal So_Tien
        {
            get { return m_So_Tien; }
            set { m_So_Tien = value; }
        }

        private string m_Ma_DMTinhTrang = string.Empty;
        public string Ma_DMTinhTrang
        {
            get { return m_Ma_DMTinhTrang; }
            set { m_Ma_DMTinhTrang = value; }
        }

        private decimal m_Doanh_Thu = 0;
        public decimal Doanh_Thu
        {
            get { return m_Doanh_Thu; }
            set { m_Doanh_Thu = value; }
        }

        private bool m_Thanh_Ly = false;
        public bool Thanh_Ly
        {
            get { return m_Thanh_Ly; }
            set { m_Thanh_Ly = value; }
        }

        private DateTime m_Ngay_ThanhLy = DateTime.Now;
        public DateTime Ngay_ThanhLy
        {
            get { return m_Ngay_ThanhLy; }
            set { m_Ngay_ThanhLy = value; }
        }
        private string m_Ly_Do = string.Empty;
        public string Ly_Do
        {
            get { return m_Ly_Do; }
            set { m_Ly_Do = value; }
        }

        private string m_Ma_DMLoaiHD = string.Empty;
        public string Ma_DMLoaiHD
        {
            get { return m_Ma_DMLoaiHD; }
            set { m_Ma_DMLoaiHD = value; }
        }

        private bool m_isPublic = true;
        public bool isPublic
        {
            get { return m_isPublic; }
            set { m_isPublic = value; }
        }

        private bool m_isCapBac = true;
        public bool isCapBac
        {
            get { return m_isCapBac; }
            set { m_isCapBac = value; }
        }

        private string m_Ma_DaiLy;
        public string Ma_DaiLy
        {
            get { return m_Ma_DaiLy; }
            set { m_Ma_DaiLy = value; }
        }

        private string m_Ten_DaiLy;
        public string Ten_DaiLy
        {
            get { return m_Ten_DaiLy; }
            set { m_Ten_DaiLy = value; }
        }
        #endregion Fields and Properties ===========================================================
        
        
        #region Actions ============================================================================
        public void Insert(DataRow dr)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();

                    SqlCommand cmd = new SqlCommand("proc_HopDong_Insert", conn);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("@Ma_DT", dr["Ma_DT"].ToString().Trim().ToUpper());
                    cmd.Parameters.AddWithValue("@Ngay_HD", dr["Ngay_HD"]);
                    cmd.Parameters.AddWithValue("@Ma_DaiLy", dr["Ma_DaiLy"]);
                    cmd.Parameters.AddWithValue("@Ten_DaiLy", dr["Ten_DaiLy"]);
                    cmd.Parameters.AddWithValue("@DMCanBoID", dr["DMCanBoID"]);
                    cmd.Parameters.AddWithValue("@Noi_O", dr["Noi_O"]);
                    cmd.Parameters.AddWithValue("@MST", dr["MST"]);
                    cmd.Parameters.AddWithValue("@CMT", dr["CMT"]);
                    cmd.Parameters.AddWithValue("@Noi_Cap", dr["Noi_Cap"]);
                    cmd.Parameters.AddWithValue("@Ngay_Cap", dr["Ngay_Cap"]);
                    cmd.Parameters.AddWithValue("@Noi_Ban", dr["Noi_Ban"]);
                    cmd.Parameters.AddWithValue("@Ngay_Ban", dr["Ngay_Ban"]);
                    cmd.Parameters.AddWithValue("@So_Tien", dr["So_Tien"]);
                    cmd.Parameters.AddWithValue("@Ma_DMTinhTrang", dr["Ma_DMTinhTrang"]);
                    cmd.Parameters.AddWithValue("@Ma_DMLoaiHD", dr["Ma_DMLoaiHD"]);
                    cmd.Parameters.AddWithValue("@Ngay_ThanhLy", dr["Ngay_ThanhLy"]);
                    cmd.Parameters.AddWithValue("@Ly_Do", dr["Ly_Do"]);
                    cmd.Parameters.AddWithValue("@isTT", dr["isTT"] == DBNull.Value ? 0 : 1);
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        public void Update(DataRow dr)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();

                    SqlCommand cmd = new SqlCommand("proc_HopDong_Update", conn);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("@ID", dr["ID"]);
                    cmd.Parameters.AddWithValue("@DMCanBoID", dr["DMCanBoID"]);
                    cmd.Parameters.AddWithValue("@Ma_DT", dr["Ma_DT"].ToString().Trim().ToUpper());
                    cmd.Parameters.AddWithValue("@Ngay_HD", dr["Ngay_HD"]);
                    cmd.Parameters.AddWithValue("@Ma_DaiLy", dr["Ma_DaiLy"]);
                    cmd.Parameters.AddWithValue("@Ten_DaiLy", dr["Ten_DaiLy"]);
                    cmd.Parameters.AddWithValue("@Noi_O", dr["Noi_O"]);
                    cmd.Parameters.AddWithValue("@MST", dr["MST"]);
                    cmd.Parameters.AddWithValue("@CMT", dr["CMT"]);
                    cmd.Parameters.AddWithValue("@Noi_Cap", dr["Noi_Cap"]);
                    cmd.Parameters.AddWithValue("@Ngay_Cap", dr["Ngay_Cap"]);
                    cmd.Parameters.AddWithValue("@Noi_Ban", dr["Noi_Ban"]);
                    cmd.Parameters.AddWithValue("@Ngay_Ban", dr["Ngay_Ban"]);
                    cmd.Parameters.AddWithValue("@So_Tien", dr["So_Tien"]);
                    cmd.Parameters.AddWithValue("@Ma_DMTinhTrang", dr["Ma_DMTinhTrang"]);
                    cmd.Parameters.AddWithValue("@Ma_DMLoaiHD", dr["Ma_DMLoaiHD"]);
                    //cmd.Parameters.AddWithValue("@Doanh_Thu", dr["Doanh_Thu"]);
                    cmd.Parameters.AddWithValue("@Ngay_ThanhLy", dr["Ngay_ThanhLy"]);
                    cmd.Parameters.AddWithValue("@Ly_Do", dr["Ly_Do"]);
                    cmd.Parameters.AddWithValue("@isTT", dr["isTT"]);
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        public void Delete(int id, bool canRestore)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    if (canRestore)
                    {
                        cmd = new SqlCommand("UPDATE HOPDONG SET isPublic = 0 Where ID = " + id + " and isPublic=1", sqlconn);
                    }
                    else
                    {
                        //Chú ý: khi thực hiện lệnh xóa này thì các dòng tương ứng bên DOANHTHU cũng bị xóa theo nhờ vào FK_HOPDONG_DOANHTHU
                        cmd = new SqlCommand("DELETE HOPDONG WHERE ID = " + id + " and isPublic = 0", sqlconn);
                    }

                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        public void Restore(int id)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    //Chú ý: khi thực hiện lệnh update này thì isPublic tương ứng ở bảng DOANHTHU cũng 
                    //tự động cập nhật theo nhờ vào trig_HOPDONG_DOANHTHU_isPublic
                    cmd = new SqlCommand("UPDATE HOPDONG SET isPublic = 1 Where ID = " + id + " and isPublic=0", sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }
        #endregion Actions =========================================================================


        #region Functions ==========================================================================
        public static void load_rilue(ref DataTable dtDMTinhTrang, ref DataTable dtDMLoaiHD)
        {
            dtDMTinhTrang = clsCommon.FillData("select * from DMTinhTrang where isPublic = 1");
            dtDMLoaiHD = clsCommon.FillData("select * from DMLOAIHOPDONG where isPublic = 1");
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="MaDV">Truyền vào '%' (nếu lấy tất cả đơn vị), hoặc mã đơn vị tương ứng.</param>
        /// <param name="DMCanBoID"></param>
        /// <param name="isPublic"></param>
        /// <param name="ThanhLy"></param>
        /// <returns></returns>
        public DataTable loadData(char MaDV, int DMCanBoID, bool isPublic, int ThanhLy)
        {
            DataTable dt = new DataTable();

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_HopDong_loadData", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                if (isPublic) da.SelectCommand.Parameters.AddWithValue("@isPublic", 1);
                else da.SelectCommand.Parameters.AddWithValue("@isPublic", 0);
                da.SelectCommand.Parameters.AddWithValue("@ThanhLy", ThanhLy);

                da.Fill(dt);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        /// <summary>
        /// Dùng tại rptInHDThang
        /// </summary>
        /// <param name="MaDV">Truyền vào là "%" hoặc mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID"></param>
        /// <param name="Ngay">Ngày đầu tiên của tháng</param>
        /// <returns></returns>
        public DataTable loadData_rptInHDThang(string MaDV, int DMCanBoID, DateTime Ngay)
        {
            DataTable dt = new DataTable("rptBiendongdlCap2");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_HD_InHDThang", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay.Date);

                da.Fill(dt);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        public string generateMaHD(char MaDV)
        {
            string ma = "";

            if (clsLicense.checkLicense())
            {
                DataTable dt = clsCommon.FillData("SELECT dbo.func_newMaHD(" + MaDV + ")");
                ma = dt.Rows[0][0].ToString().Trim();
            }

            return ma;
        }

        /// <summary>
        /// Trả về một mã đại lý mới theo mã cán bộ truyền vào.
        /// </summary>
        /// <param name="MaCB"></param>
        /// <returns></returns>
        public string generateMaDL(string MaCB)
        {
            string ma = "";

            if (clsLicense.checkLicense())
            {
                try
                {
                    DataTable dt = clsCommon.FillData("SELECT dbo.func_newMaDL('" + MaCB + "')");
                    ma = dt.Rows[0][0].ToString().Trim();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }

            return ma;
        }
        #endregion Functions =======================================================================
        
        
        #region Check value ========================================================================
        public static bool checkMaHD(string mahd) //check for addnew
        {
            return !clsCommon.isDuplicate("Ma_DT", mahd, "HOPDONG");
        }

        public static bool checkMaHD(string mahd, int id) //check for edit
        {
            return !clsCommon.isDuplicate("Ma_DT", mahd, "HOPDONG", id);
        }

        /// <summary>
        /// Dùng tại frmDMHopDong, clsChuyenDL
        /// </summary>
        /// <param name="madl"></param>
        /// <returns></returns>
        public static int checkMaDL(string madl) //check for addnew
        {
            //kiểm tra trùng với các mã chưa thanh lý
            //DataTable dt = clsCommon.FillData("SELECT Ma_DaiLy FROM HOPDONG WHERE Ngay_ThanhLy is null and Ma_DaiLy = '" + madl + "'");
            //if (dt.Rows.Count > 0) return 1;

            ////kiểm tra trùng với các mã đã thanh lý (chỉ được phép trùng nếu đã thanh lý từ năm trước)
            //dt = clsCommon.FillData("SELECT Ma_DaiLy, Ngay_ThanhLy FROM HOPDONG WHERE Ngay_ThanhLy is not null and Ma_DaiLy = '" + madl + "'");
            //if (dt.Rows.Count > 0)
            //{
            //    DateTime NgayTL = new DateTime();
            //    while (dt.Rows.Count > 0)
            //    {
            //        NgayTL = (DateTime)dt.Rows[0]["Ngay_ThanhLy"];
            //        if (NgayTL.Year < DateTime.Now.Year) dt.Rows.RemoveAt(0);
            //        else return 2;
            //    }
            //}
            DataTable dt = new DataTable();

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("sp_HopDong_CheckDaiLyTrung", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@MaDaiLy", madl);

                da.Fill(dt);
                if (dt.Rows.Count > 0)
                {
                    if (dt.Rows[0][0].ToString() == "1")
                        return 1;
                }
            }
            catch (SqlException)
            {
                clsCommon.MsgBox("Lỗi store",0);
            }
            catch (Exception)
            {

                clsCommon.MsgBox("Có lỗi xãy ra", 0);
            }
            return 0;
        }

        public static int checkMaDL(string madl, int id, DateTime NgayTL=new DateTime()) //check for edit
        {
            DataTable dt;
            if (NgayTL.Date == new DateTime().Date)     //trường hợp chưa thanh lý
            {
                //kiểm tra trùng với các mã chưa thanh lý
                dt = clsCommon.FillData("SELECT Ma_DaiLy FROM HOPDONG WHERE ID<>" + id +
                    " and Ngay_ThanhLy is null and Ma_DaiLy = '" + madl + "'");
                if (dt.Rows.Count > 0) return 1;

                ////kiểm tra trùng với các mã đã thanh lý năm nay
                //dt = clsCommon.FillData("SELECT Ma_DaiLy, Ngay_ThanhLy FROM HOPDONG WHERE Ngay_ThanhLy is not null and Ma_DaiLy = '" + madl + "'");
                //if (dt.Rows.Count > 0)
                //{
                //    while (dt.Rows.Count > 0)
                //    {
                //        NgayTL = (DateTime)dt.Rows[0]["Ngay_ThanhLy"];
                //        if (NgayTL.Year < DateTime.Now.Year) dt.Rows.RemoveAt(0);
                //        else return 2;
                //    }
                //}
            }
            else    //trường hợp đã thanh lý
            {
                //if (NgayTL.Year == DateTime.Now.Year) //nếu là thanh lý năm nay thì không được trùng với các mã chưa thanh lý
                //{
                //    dt = clsCommon.FillData("SELECT Ma_DaiLy FROM HOPDONG WHERE Ngay_ThanhLy is null and Ma_DaiLy = '" + madl + "'");
                //    if (dt.Rows.Count > 0) return 3;
                //}

                ////kiểm tra xem có trùng mã với hợp đồng thanh lý cùng năm hay không
                //dt = clsCommon.FillData("SELECT Ma_DaiLy, Ngay_ThanhLy FROM HOPDONG WHERE ID<>" + id +
                //    " and Ngay_ThanhLy is not null and Ma_DaiLy = '" + madl + "'");
                //if (dt.Rows.Count > 0)
                //{
                //    while (dt.Rows.Count > 0)
                //    {
                //        DateTime NgayTL2 = (DateTime)dt.Rows[0]["Ngay_ThanhLy"];
                //        if (NgayTL.Year != NgayTL2.Year) dt.Rows.RemoveAt(0);
                //        else return 4;
                //    }
                //}

                //kiểm tra xem có trùng mã với hợp đồng thanh lý khác hay không
                dt = clsCommon.FillData("SELECT Ma_DaiLy, Ngay_ThanhLy FROM HOPDONG WHERE ID<>" + id +
                    " and Ngay_ThanhLy is not null and Ma_DaiLy = '" + madl + "'");
                if (dt.Rows.Count > 0)
                {
                    return 5;
                }
            }

            return 0;
        }

        public static bool checkCMT(string cmt) //check for addnew
        {
            return !clsCommon.isDuplicate("CMT", cmt, "HOPDONG");
        }

        public static bool checkCMT(string cmt, int id) //check for edit
        {
            return !clsCommon.isDuplicate("CMT", cmt, "HOPDONG", id);
        }
        #endregion Check value =====================================================================
    }
}
